<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // //call
    // function fn() {
    //     console.log(this, arguments);

    // }
    // Function.prototype.myCall = function () {
    //     var a = Array.prototype.slice.apply(arguments);
    //     var a1 = a[0] || window;
    //     var a2 = a.slice(1);
    //     a1.fn = this;
    //     a1.fn(...a2);
    //     delete a1.fn
    // }
    // fn.myCall({ name: 'jay' }, 1, 1, 1, 1);









    // //apply
    // function fn() {
    //     console.log(this, arguments);

    // }
    // Function.prototype.myApply = function () {
    //     var a = Array.prototype.slice.apply(arguments);
    //     var a1 = a[0] || window;
    //     var a2 = a[1];
    //     a1.fn = this;
    //     a1.fn(...a2);
    //     delete a1.fn
    // }
    // fn.myApply({ name: 'jay' }, [1, 1, 1, 1]);








    // // bind
    // function fn() {
    //     console.log(this, arguments);

    // }
    // Function.prototype.myBind = function () {
    //     var a = Array.prototype.slice.call(arguments);
    //     var a1 = a[0]
    //     var a2 = a.slice(1);
    //     return () => {
    //         var c = Array.prototype.slice.call(arguments);
    //         return this.apply(a1, a2.concat(c))
    //     }

    // }
    // fn.myBind({ name: 'jay' }, 1, 1, 1, 1);
    // var d = fn.myBind({ name: 'jay' }, 1, 1, 1, 1);
    // console.log(d());











    // // new
    // function fn(name, age) {
    //     this.name = name
    //     this.age = age

    // }
    // function myNew(fn, ...a) {
    //     // 创建一个空对象
    //     var obj = Object.create(fn.prototype);
    //     // 改变this指向
    //     var b = fn.apply(obj, a)
    //     // 返回这个对象
    //     return obj

    // }
    // var c = myNew(fn, '小甜', 18)
    // console.log(c);
    // console.log(c.name);
    // console.log(c.age);

</script>

</html>